/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package model.vendavista;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceException;
import javax.persistence.Query;
import model.dao.IRepositorioVendaVista;
import model.daoimpl.GenericDAO;
import model.estoque.Estoque;
import model.excecoes.ErroDAOException;
import model.produto.Produto;

/**
 *
 * @author Marcos
 */
public class RepositorioVendaVista extends GenericDAO<VendaVista> implements IRepositorioVendaVista {

    @Override
    public int identificarCodigoProduto(String descricao, String marca) throws ErroDAOException, PersistenceException, NoResultException {
        int codigo = 0;

        try {
            Query query = this.getManager().createQuery("Select v.produtos.codigo From VendaVista v JOIN FETCH v.produtos Where v.produtos.descricao = :descricao and v.produtos.marca = :marca");
            query.setParameter("descricao", descricao);
            query.setParameter("marca", marca);
            if (query.getFirstResult() != 0) {
                codigo = query.getFirstResult();
            }
        } catch (NoResultException ex) {
            throw new ErroDAOException("Erro de Consulta.\nDetalhes Técnicos:\n" + ex.getMessage());
        } catch (PersistenceException ex) {
            throw new ErroDAOException("Erro de Persistência.\nDetalhes Técnicos:\n" + ex.getMessage());
        }

        return codigo;
    }

    @Override
    public boolean verificarQuantidadeProduto(String descricao, int quantidade, String marca) throws ErroDAOException, PersistenceException, NoResultException {
        boolean verificar = false;

        try {
            Query query = this.getManager().createQuery("Select e From Estoque e JOIN FETCH e.produto Where e.produto.descricao = :descricao and e.produto.marca = :marca and e.quantidadeChegada <:quantidade");
            query.setParameter("descricao", descricao);
            query.setParameter("marca", marca);
            query.setParameter("quantidade", quantidade);
            if(query.getFirstResult() != 0){
                verificar = true;
            }
        } catch (NoResultException ex) {
            throw new ErroDAOException("Erro de Consulta.\nDetalhes Técnicos:\n" + ex.getMessage());
        } catch (PersistenceException ex) {
            throw new ErroDAOException("Erro de Persistência.\nDetalhes Técnicos:\n" + ex.getMessage());
        }

        return verificar;
    }

    @Override
    public List<VendaVista> listarVendaVista(String consulta, String campo) throws ErroDAOException, PersistenceException, NoResultException {
        List<VendaVista> vendas = null;
        Query query = null;
        
        try{
            if(consulta.equals("Todos") && campo.equals("Todos")){
                query = this.getManager().createQuery("Select v From VendaVista v JOIN FETCH v.produtos JOIN FETCH v.perfil");
            }else{
                if(campo.equals("Código")){
                    query = this.getManager().createQuery("Select v From VendaVista v JOIN FETCH v.produtos JOIN FETCH v.perfil Where v.codigo = :codigo");
                    query.setParameter("codigo", Integer.parseInt(consulta));
                }else{
                    if(campo.equals("Data da Venda")){
                        query = this.getManager().createQuery("Select v From VendaVista v JOIN FETCH v.produtos JOIN FETCH v.perfil Where v.dataVenda = :dataVenda");
                        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
                        try {
                            query.setParameter("dataVenda", format.parse(consulta));
                        } catch (ParseException ex) {
                            Logger.getLogger(RepositorioVendaVista.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }else{
                        if(campo.equals("")){
                            
                        }
                    }
                }
            }
        }catch(NoResultException ex){
            throw new ErroDAOException("Erro de consulta.\nDetalhes Técnicos:\n" + ex.getMessage());
        }catch(PersistenceException ex){
            throw new ErroDAOException("Erro de Persistência.\nDetalhes Técnicos:\n" + ex.getMessage());
        }
        vendas = query.getResultList();
        return vendas;
    }

    @Override
    public int identificaCodigoPerfil(String nome, String login) throws ErroDAOException, PersistenceException, NoResultException {
        int codigoPerfil = 0;
        
        try{
            Query query = this.getManager().createQuery("Select l.codigo From Perfil l JOIN FETCH l.cliente Where l.cliente.nome = :nome and l.cliente.login = :login");
            query.setParameter("nome", nome);
            query.setParameter("login", login);
            if(!query.getResultList().isEmpty()){
                codigoPerfil = query.getFirstResult();
            }
        }catch(NoResultException ex){
            throw new ErroDAOException("Erro de Consulta.\nDetalhes Técnicos:\n" + ex.getMessage());
        }catch(PersistenceException ex){
            throw new ErroDAOException("Erro de Persistência.\nDetalhes Técnicos:\n" + ex.getMessage());
        }
        
        return codigoPerfil;
    }

    @Override
    public boolean verificarQuantidade(String descricao, String marca, int quantidade) throws ErroDAOException, PersistenceException, NoResultException {
        boolean verificar = false;
        
        try{
           Query query = this.getManager().createQuery("Select e.quantidadeChegada as quantidade From Estoque e JOIN FETCH e.produto Where e.produto.descricao =:descricao and e.produto.marca =:marca and e.quantidadeChegada < :quantidade");
           query.setParameter("desricao", descricao);
           query.setParameter("marca", marca);
           query.setParameter("quantidade", quantidade);
           if(!query.getResultList().isEmpty()){
               verificar = true;
           }
        }catch(NoResultException ex){
            throw new ErroDAOException("Erro de Consulta.\nDetalhes Técnicos:\n" + ex.getMessage());
        }catch(PersistenceException ex){
            throw new ErroDAOException("Erro de Persistência.\nDetalhes Técnicos:\n" + ex.getMessage());
        }
        
        return verificar;
    }

    public int identificarCodigoEstoque(String descricao, String marca) throws ErroDAOException, PersistenceException, NoResultException{
        int codigoEstoque = 0;
        try{
            Query query = this.getManager().createQuery("Select e.id From Estoque e JOIN FETCH e.produto Where e.produto.descricao = :descricao and e.produto.marca = :marca");
            query.setParameter("descricao", descricao);
            query.setParameter("marca", marca);
            codigoEstoque = query.getFirstResult();
        }catch(NoResultException ex){
            
        }catch(PersistenceException ex){
            
        }
        return codigoEstoque;
    }
    @Override
    public void darBaixaProdutoEstoque(String descricao, String marca, int quantidade) throws ErroDAOException, PersistenceException, NoResultException {
        
        Query query = null;
        
        
        try{
            int total = 0;
            query = this.getManager().createQuery("Select e.quantidadeChegada From Estoque e JOIN FETCH e.produto Where e.produto.descricao = :descricao and e.produto.marca = :marca");
            query.setParameter("descricao", descricao);
            query.setParameter("marca", this);
            total = query.getFirstResult() - quantidade;
            int codigo = identificarCodigoEstoque(descricao, marca);
            Estoque estoque = this.getManager().find(Estoque.class, codigo);
            estoque.setQuantidadeChegada(total);
            this.getManager().getTransaction().begin();
            this.getManager().merge(estoque);
            this.getManager().getTransaction().commit();
            
        }catch(NoResultException ex){
            throw new ErroDAOException("Erro de Consulta.\nDetalhes Técnicos:\n" + ex.getMessage());
        }catch(PersistenceException ex){
            throw new ErroDAOException("Erro de Persistência.\nDetalhes Técnicos:\n" + ex.getMessage());
        }
        
    }

}
